﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Librerias;


namespace eCampus
{
    /// <summary>
    /// Formulario para consultar material
    /// </summary>

    public partial class FormMaterialConsultar : Form
    {
        /// <summary>
        /// variables
        /// </summary>
        public ENMaterial en;
        string usuario, asignatura;

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="usu">usuario</param>
        /// <param name="asi">asignatura</param>
        public FormMaterialConsultar(string usu, string asi)
        {
            usuario = usu;
            asignatura  = asi;
            InitializeComponent();
            cbFiltro.SelectedIndex = 0;
        }



        /// <summary>
        /// Función de actualización de DataGrid
        /// </summary>
        /// <param name="primeraVez">Si se carga por primera vez el DataGridView hay que invocar a la funcion con éste parámetro a true</param>
        private void ActualizaDataGrid(bool primeraVez = false)
        {
            if (btBusqueda.Visible)
            {
                try
                {
                    //Coge datos de la bd
                    dgMateriales.DataSource = en.GetMateriales(tbBuscar.Text, "mat" + cbFiltro.Text);

                    dgMateriales.Columns["matRuta"].Visible = true;
                    dgMateriales.Columns["matRuta"].HeaderText = "Ruta";
                }
                catch (Exception)
                {
                    MessageBox.Show("Error al buscar", "Error");
                    btRestablecer_Click(null, null);
                }
            }
            else
            {
                if (primeraVez)
                {
                    //Añade columna tipo
                    DataGridViewImageColumn ColTipo = new DataGridViewImageColumn();
                    ColTipo.Name = "tipo";
                    ColTipo.HeaderText = "";
                    ColTipo.Image = eCampus.Properties.Resources.btDescargasMini;
                    ColTipo.Width = 30;
                    dgMateriales.Columns.Add(ColTipo);
                }

                //Coge datos de la bd
                dgMateriales.DataSource = en.GetMateriales();

                dgMateriales.Columns["matRuta"].Visible = false;

                if (primeraVez)
                {
                    //Añade columna eliminar
                    DataGridViewImageColumn ColEliminar = new DataGridViewImageColumn();
                    ColEliminar.Name = "elim";
                    ColEliminar.HeaderText = "";
                    ColEliminar.Image = eCampus.Properties.Resources.btBorrar;
                    ColEliminar.Width = 30;
                    dgMateriales.Columns.Add(ColEliminar);

                    //Ocula los que no interesan
                    dgMateriales.Columns["matId"].Visible = false;
                    dgMateriales.Columns["matAsignatura"].Visible = false;
                    dgMateriales.Columns["matDescripcion"].Visible = false;

                    //Pone nombres chulis
                    dgMateriales.Columns["tipo"].HeaderText = "";
                    dgMateriales.Columns["matArchivo"].HeaderText = "Archivo";
                    dgMateriales.Columns["matTitulo"].HeaderText = "Título";
                    dgMateriales.Columns["matCorreo"].HeaderText = "Subido por";
                    dgMateriales.Columns["elim"].HeaderText = "";

                    dgMateriales.Columns["matTitulo"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                }
            }
        }


        /// <summary>
        /// Invoca al formulario que crea nuevos materiales
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btNuevo_Click(object sender, EventArgs e)
        {
            FormMaterialCrear n = new FormMaterialCrear(en,this);
            n.ShowDialog();
            ActualizaDataGrid();
        }

        /// <summary>
        /// Comprueba si un nombre ya existe en éste ámbito
        /// </summary>
        /// <param name="comp">nombre a comprobar</param>
        /// <returns></returns>
        public bool NoExisteNombre(string comp)
        {
            for (int i = 0; i < dgMateriales.Rows.Count; i++)
            {
                if (dgMateriales["matArchivo", i].Value.ToString().Replace("/","") == comp)
                {
                    return false;
                }
            }
            
            return true;
        }

        /// <summary>
        /// Invoca al formulario que crea una nueva carpeta
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btAceptarCarpeta_Click(object sender, EventArgs e)
        {
            FormMaterialCarpeta n = new FormMaterialCarpeta(this);
            n.ShowDialog();
            ActualizaDataGrid();
        }

        /// <summary>
        /// Aplica formato a la tabla.
        /// Dibuja el icono directorio en casa de que lo sea
        /// Le da formato a la ruta a DropBox (donde se almacenan los ficheros)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dgMateriales_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (e.Value != null)
            {
                //Dibuja un directorio si no es un fichero
                if (e.ColumnIndex == dgMateriales.Columns["tipo"].Index &&
                    dgMateriales["matArchivo", e.RowIndex].Value.ToString().StartsWith("/"))
                {
                    e.Value = Properties.Resources.btDirectorio; 
                }
                else if (e.ColumnIndex == dgMateriales.Columns["matRuta"].Index)
                {
                    e.Value = e.Value.ToString().Substring(1);
                    e.Value = e.Value.ToString().Substring(e.Value.ToString().IndexOf('/'));
                }
                //Elimina la "/" que identifica que es un directorio
                else if (e.Value.ToString().StartsWith("/"))
                {
                    e.Value = e.Value.ToString().Substring(1);
                }
            }
        }

        /// <summary>
        /// Funciones al hacer click en una celda (Eliminar, Descargar,Acceder y Modificar)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dgMateriales_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0 )
            {
                //Eliminar
                if (e.ColumnIndex == dgMateriales.Columns["elim"].Index)
                {
                    if (MessageBox.Show("¿Desea eliminar permanentemente \"" + dgMateriales["matArchivo", e.RowIndex].Value.ToString() + "\"?", "Eliminar", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                    {
                        en.EliminarMaterial(dgMateriales["matId", e.RowIndex].Value.ToString(), dgMateriales["matRuta", e.RowIndex].Value.ToString()+dgMateriales["matArchivo", e.RowIndex].Value.ToString().Replace("/", ""));
                        ActualizaDataGrid();
                    }
                }
                //Descargar
                else if (e.ColumnIndex == dgMateriales.Columns["tipo"].Index && !dgMateriales["matArchivo", e.RowIndex].Value.ToString().StartsWith("/"))
                {
                    SaveFileDialog dialogoDescarga = new SaveFileDialog();
                    dialogoDescarga.Title = "Descargar";
                    dialogoDescarga.FileName = dgMateriales["matArchivo", e.RowIndex].Value.ToString();
                    if (dialogoDescarga.ShowDialog() == DialogResult.OK)
                    {
                        if (en.Descargar(dgMateriales["matRuta", e.RowIndex].Value.ToString() + dgMateriales["matArchivo", e.RowIndex].Value.ToString(), dialogoDescarga.FileName.Substring(0, dialogoDescarga.FileName.LastIndexOf("\\"))))
                        {
                            MessageBox.Show("El fichero se ha descargado correctamente", "Descarga finalizada");
                        }
                        else
                        {
                            MessageBox.Show("La descarga no se realizó correctamente", "Error en la descarga");
                        }
                    }
                }
                //Acceder
                else if (dgMateriales["matArchivo", e.RowIndex].Value.ToString().StartsWith("/"))
                {

                    //Si hay búsqueda la desactiva
                    if (btBusqueda.Visible)
                    {
                        en.Ruta = dgMateriales["matRuta", e.RowIndex].Value.ToString() + dgMateriales["matArchivo", e.RowIndex].Value.ToString().Replace("/", "") + "/";
                        tbBuscar.Text = "";
                        btBusqueda.Visible = false;
                        btNuevo.Visible = true;
                        btAceptarCarpeta.Visible = true;

                    }

                    //Directorio
                    en.AccedeA(dgMateriales["matRuta", e.RowIndex].Value.ToString() + dgMateriales["matArchivo", e.RowIndex].Value.ToString().Replace("/", "") + "/");
                    ActualizaDataGrid();
                    btVolver.Visible = true;
                }
                //Modificar
                else
                {
                    string rutaAux = en.Ruta;

                    //Fichero
                    en.Id = int.Parse(dgMateriales["matId"         , e.RowIndex].Value.ToString()); 
                    en.Titulo      =  dgMateriales["matTitulo"     , e.RowIndex].Value.ToString();
                    en.Descripcion =  dgMateriales["matDescripcion", e.RowIndex].Value.ToString();
                    en.Archivo     =  dgMateriales["matArchivo"    , e.RowIndex].Value.ToString();
                    en.Ruta        =  dgMateriales["matRuta"       , e.RowIndex].Value.ToString();

                    FormMaterialCrear n = new FormMaterialCrear(en, this, true);
                    n.ShowDialog();

                    if (btBusqueda.Visible) en.Ruta = rutaAux;

                    ActualizaDataGrid();
                }
            }
        }

        /// <summary>
        /// Procesos al cargar este formulario.
        /// Crea instancia de ENMaterial y actualiza la tabla por primera vez
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FormMaterialConsultar_Load(object sender, EventArgs e)
        {
            en = new ENMaterial(usuario, asignatura);

            //Como es la primera vez que se pinta la tabla, se pone la booleana primeraVez=true
            ActualizaDataGrid(true);
        }

        /// <summary>
        /// Calcula la profundidad en la que se encuentra el navegador de archivos
        /// </summary>
        private void CalculaProfundidad()
        {
            int profundidad = en.Ruta.Split('/').Length - 3;

            if (profundidad == 0)
            {
                btVolver.Visible = false;
            }
        }

        /// <summary>
        /// Botón para acceder a la carpeta padre
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btVolver_Click(object sender, EventArgs e)
        {
            en.Volver();
            ActualizaDataGrid();

            CalculaProfundidad();
        }

        /// <summary>
        /// Nueva búsqueda
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btBusquedaSimple_Click(object sender, EventArgs e)
        {
            btBusqueda.Visible = true;
            btNuevo.Visible = false;
            btAceptarCarpeta.Visible = false;

            ActualizaDataGrid();
        }

        /// <summary>
        /// Eliminar búsqueda
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btRestablecer_Click(object sender, EventArgs e)
        {
            tbBuscar.Text = "";
            btBusqueda.Visible = false;
            btNuevo.Visible = true;
            btAceptarCarpeta.Visible = true;
            ActualizaDataGrid();
        }

        private void dgMateriales_SelectionChanged(object sender, EventArgs e)
        {
            dgMateriales.ClearSelection();
        }
    }
}
